/**
 * 
 */
package com.deep.test.thread;

/**
 * 死锁程序演示
 * 
 * 如何避免死锁
 *  1、避免一个线程同时获取多个锁。
	2、避免一个线程在锁内同时占用多个资源，尽量保证每个锁只占用一个资源。
	3、尝试使用定时锁，使用lock.tryLock（timeout）来替代使用内部锁机制。
	4、对于数据库锁，加锁和解锁必须在一个数据库连接里，否则会出现解锁失败的情况。
 * @author hudepin
 *
 * 2018年4月12日下午4:23:37
 */
public class DeadLockDemo {
	public static String A = "A";
	public static String B = "B";
	public static void main(String[] args) {
	Thread t1 =	new Thread(new Runnable() {
			
			@Override
			public void run() {
				synchronized (A) {
					try {
						System.out.println( Thread.currentThread().getName()+" take A lock");
						Thread.sleep(2000);
						synchronized (B) {
							System.out.println( Thread.currentThread().getName()+"take B lock");
						}
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				
			}
		});
		
		Thread t2 =	new Thread(new Runnable() {
				
				@Override
				public void run() {
					synchronized (B) {
							System.out.println( Thread.currentThread().getName()+" take B lock1");
							synchronized (A) {
								System.out.println( Thread.currentThread().getName()+"take A lock1");
							}
					}
					
				}
			});
		t1.start();
		t2.start();
	}
	
}
